package ru.zombator.taskman.core.query;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

public class TypedPacket implements ITypedPacket {
	private IPacket untyped;
	private Object object;

	/**
	 * Создает пакет для передачи заданного объекта
	 * 
	 * @param object
	 *            - передаваемый объект
	 * @throws IOException
	 *             не удается сериализовать объект для передачи по сети
	 */
	public TypedPacket(Object object) throws IOException {
		this.object = object;
		updateBlob();
	}

	/**
	 * Создает пакет для приема заданного объекта
	 * 
	 * @param untyped
	 *            - "сырой" пакет, из которого извлекается объект
	 * @throws IOException
	 *             не удалось десериализовать
	 * @throws ClassNotFoundException
	 *             не найден класс объекта
	 */
	public TypedPacket(IPacket untyped) throws IOException,
			ClassNotFoundException {
		this.untyped = untyped;

		ByteArrayInputStream bais = new ByteArrayInputStream(this.untyped
				.bytes());
		ObjectInputStream ois = new ObjectInputStream(bais);
		this.object = ois.readObject();
	}

	private void updateBlob() throws IOException {
		ByteArrayOutputStream baos = new ByteArrayOutputStream();
		ObjectOutputStream oos = new ObjectOutputStream(baos);
		oos.writeObject(this.object);
		oos.close();

		this.untyped = new Packet(baos.toByteArray());
		baos.close();
	}

	@Override
	public Object asObject() {
		return this.object;
	}

	@Override
	public IPacket asUntyped() {
		return this.untyped;
	}

	@Override
	public void setObject(Object object) throws IOException {
		this.object = object;
		updateBlob();
	}
}
